package com.situ.day22;

import com.situ.day5.Person;
import com.situ.day5.Teacher;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

public class GenericDemo {

    @Test
    public void test1() {
        List list = new ArrayList<>();
        list.add("Java");
        list.add(1);

        String str = (String) list.get(0);
    }

    //使用泛型
    @Test
    public void test2() {
        //声明泛型集合的时候指定元素的类型
        List<String> list = new ArrayList<>();
        list.add("java");
        //可以在编译时期进行类型检查
        //list.add(1);

        //使用的时候返回的就是String，不需要类型转换
        String str = list.get(0);
    }

    @Test
    public void test3() {
        //两端的数据类型必须一致
        List<Object> list1 = new ArrayList<Object>();
        List<String> list2 = new ArrayList<String>();
        //右端的泛型可以不写
        List<String> list3 = new ArrayList<>();
        //只在右端写泛型是不起作用
        List list4 = new ArrayList<String>();
        list4.add(1);

        //两端不一致会报错
        //List<Object> list5 = new ArrayList<String>();
        //泛型类型必须是引用数据类型
        //List<int> list6 = new ArrayList<int>();
        List<Integer> list6 = new ArrayList<Integer>();
    }

    @Test
    public void test5(){
        List<String> list1 = new ArrayList<String>();  //创建泛型
        List<Integer> list2 = new ArrayList<Integer>();
        System.out.println(list1.getClass() == list2.getClass());

        // List<String>.class   List<Integer>.class
        // List.class
    }

    //'save(List<Student>)' clashes with 'save(List<Person>)'; both methods have same erasure
//    public void save(List<Student> list) {
//
//    }

//    public void save(List<Person> list) {
//
//    }

    public void save(List<?> list) {
        //list.add(new Student());
    }

    @Test
    public void test22() {
        List<Student> list1 = new ArrayList<>();
        List<Teacher> list2 = new ArrayList<>();
        save(list1);
        save(list2);

        List list = new ArrayList();
        save(list);
    }

}
